JAVA如何调用C/C++动态库 |
您所在的位置:网站首页 › java 动态库调用 › JAVA如何调用C/C++动态库 |
一、调用方式: JAVA调用C/C++动态库有很多方法,常用的有JNI(Java Native Interface)、JNA(Java Native Access)。 JNI:早在JAVA1.1版本就开始支持,它定义了一种公用的语法,当java和c/c++双方都遵循该语法时,可以互相调用。所以使用JNI不能直接调用一般的C/C++库,而必须借助于一个中间动态库,该中间动态库实现了JAVA-JNI语法-C/C++的转换(或者你所调用的动态库原生就封装了JNI)。如果对C++稍微懂一点,其实使用起来也不难。作者:宋清日 链接:https://zhuanlan.zhihu.com/p/465601205 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 java通过JNI(Java Native Interface)与其他语言编写的代码进行交互。 JNI工作示意图(网上下载的)Java要调用第三方动态库,通俗点说就是需要将这个第三方动态库按照Java语言的要求再封装一次,变成Java可以调用的新动态库,这个新动态库去调用原始的动态库。 编写带有native声明的方法的Java类,该方法要与真正调用的动态库的方法和参数和返回值均一致。(直接用IDEA新建Java项目) package com.JniDemo; public class JniDemo { static { System.load("/root/Jni_Lib/libJniDemo.so"); } public native int add(int a, int b); public native String print(String msg); public static void main(String[] args) { JniDemo demo = new JniDemo(); demo.print("11"); } }2. 编译Java类生成.class文件。(build一下创建的project) 3. 使用javah生成JNI头文件。 每次头文件有改动的话,直接用工具重新生成,比较方便。 4. 拿到生成的头文件。 /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class com_JniDemo_JniDemo */ #ifndef _Included_com_JniDemo_JniDemo #define _Included_com_JniDemo_JniDemo #ifdef __cplusplus extern "C" { #endif /* * Class: com_JniDemo_JniDemo * Method: add * Signature: (II)I */ JNIEXPORT jint JNICALL Java_com_JniDemo_JniDemo_add (JNIEnv *, jobject, jint, jint); /* * Class: com_JniDemo_JniDemo * Method: print * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_JniDemo_JniDemo_print (JNIEnv *, jobject, jstring); #ifdef __cplusplus } #endif #endif以上就完成JNI头文件的生成,在小编看来上面这些步骤Linux与window都一样,都是生成了Java可以调用的C++头文件,至于后面调用window的dll库或者Linux上的so库,才会有区别。 5. 新建C++动态库项目(Linux) 新建的动态库项目首先要包含三个文件,首先就是生成的JNI头文件com_JniDemo_JniDemo.h,另外两个是jni.h(在JDK目录的include目录下,/usr/java/jdk1.8.0201/include/jni.h)和 jni_md.h(在JDK目录的include的linux目录下,/usr/java/jdk1.8.0_201/include/linux/jni_md.h)。 后面两个文件可以直接复制到你的动态库项目里面,不用再配置文件路径了,比较方便,另外一个小细节可以注意一下,com_JniDemo_JniDemo.h文件中包含jni.h头文件的时候用的是#include , 如果把文件考到项目中,则需要改成#include "jni.h"。 6. 新建JniDemo.cpp文件,编译生成动态库。 #include "com_JniDemo_JniDemo.h" #include #include using namespace std; JNIEXPORT jint JNICALL Java_com_JniDemo_JniDemo_add (JNIEnv *env, jobject job, jint a, jint b) { jint c; c = a + b; return c; } JNIEXPORT jstring JNICALL Java_com_JniDemo_JniDemo_print (JNIEnv * env, jobject job, jstring s) { char str[] = "welcome"; std::string hello = "hello form c++"; cout |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |